#Boa:Dialog:Transaccion

import wx
from wx.lib.anchors import LayoutAnchors
import wx.grid
import consultasBD
import NoCodBarrasEncontrado
import DeseaSalir
import utiles
import Transaccion
import sincronizar_tabla
import Vista

def create(parent):
    return Transaccion(parent)

[wxID_TRANSACCION, wxID_TRANSACCIONFECHATRANSFERENCIA, wxID_TRANSACCIONGRID1, 
 wxID_TRANSACCIONGUARDATRANS, wxID_TRANSACCIONINCANTPRODUCTOS, 
 wxID_TRANSACCIONINDESNOMBRESUC, wxID_TRANSACCIONINIDDESSUC, 
 wxID_TRANSACCIONINIDSUCURSAL, wxID_TRANSACCIONINNOMBRESUCURSAL, 
 wxID_TRANSACCIONNROTRANSFERENCIA, wxID_TRANSACCIONSPINBUTTON1, 
 wxID_TRANSACCIONSTATICTEXT1, wxID_TRANSACCIONSTATICTEXT2, 
 wxID_TRANSACCIONSTATICTEXT3, wxID_TRANSACCIONSTATICTEXT4, 
 wxID_TRANSACCIONTXTTRANSFERENCIA, 
] = [wx.NewId() for _init_ctrls in range(16)]

class Transaccion(Transaccion.Transaccion):
    modificables = []
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_TRANSACCION, name='', parent=prnt,
              pos=wx.Point(381, 114), size=wx.Size(600, 490),
              style=wx.DEFAULT_DIALOG_STYLE, title='Listado de Transacciones')
        self.SetClientSize(wx.Size(592, 456))
        self.Show(True)

        self.staticText1 = wx.StaticText(id=wxID_TRANSACCIONSTATICTEXT1,
              label='Origen:', name='staticText1', parent=self, pos=wx.Point(8,
              8), size=wx.Size(37, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_TRANSACCIONSTATICTEXT2,
              label='Destino:', name='staticText2', parent=self, pos=wx.Point(8,
              32), size=wx.Size(41, 13), style=0)

        self.fechatransferencia = wx.DatePickerCtrl(id=wxID_TRANSACCIONFECHATRANSFERENCIA,
              name='fechatransferencia', parent=self, pos=wx.Point(304, 32),
              size=wx.Size(96, 21), style=wx.DP_SHOWCENTURY)
        self.fechatransferencia.Enable(False)

        self.staticText3 = wx.StaticText(id=wxID_TRANSACCIONSTATICTEXT3,
              label='Fecha:', name='staticText3', parent=self, pos=wx.Point(272,
              32), size=wx.Size(34, 13), style=0)

        self.grid1 = wx.grid.Grid(id=wxID_TRANSACCIONGRID1, name='grid1',
              parent=self, pos=wx.Point(8, 56), size=wx.Size(568, 280),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnGrid1CAMBIACELDa)

        self.guardatrans = wx.Button(id=wxID_TRANSACCIONGUARDATRANS,
              label=u'Imprimir', name='guardatrans', parent=self,
              pos=wx.Point(416, 408), size=wx.Size(160, 32), style=0)
        self.guardatrans.Bind(wx.EVT_BUTTON, self.OnImprimir,
              id=wxID_TRANSACCIONGUARDATRANS)

        self.staticText4 = wx.StaticText(id=wxID_TRANSACCIONSTATICTEXT4,
              label='Cant. Productos:', name='staticText4', parent=self,
              pos=wx.Point(384, 360), size=wx.Size(83, 13), style=0)

        self.incantProductos = wx.TextCtrl(id=wxID_TRANSACCIONINCANTPRODUCTOS,
              name='incantProductos', parent=self, pos=wx.Point(472, 360),
              size=wx.Size(100, 21), style=0, value='0')
        self.incantProductos.SetEditable(False)

        self.txttransferencia = wx.StaticText(id=wxID_TRANSACCIONTXTTRANSFERENCIA,
              label='Nro. de Transferencia:', name='txttransferencia',
              parent=self, pos=wx.Point(272, 8), size=wx.Size(110, 13),
              style=0)

        self.nrotransferencia = wx.TextCtrl(id=wxID_TRANSACCIONNROTRANSFERENCIA,
              name='nrotransferencia', parent=self, pos=wx.Point(392, 8),
              size=wx.Size(100, 21), style=0, value='')
        self.nrotransferencia.Bind(wx.EVT_KILL_FOCUS,
              self.OnNro_transferenciaKillFocus)

        self.spinButton1 = wx.SpinButton(id=wxID_TRANSACCIONSPINBUTTON1,
              name='spinButton1', parent=self, pos=wx.Point(408, 32),
              size=wx.Size(72, 17), style=wx.SP_HORIZONTAL)
        self.spinButton1.Bind(wx.EVT_SPIN_UP, self.OnSpinUp,
              id=wxID_TRANSACCIONSPINBUTTON1)
        self.spinButton1.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown,
              id=wxID_TRANSACCIONSPINBUTTON1)

        self.inidsucursal = wx.TextCtrl(id=wxID_TRANSACCIONINIDSUCURSAL,
              name='inidsucursal', parent=self, pos=wx.Point(56, 8),
              size=wx.Size(24, 21), style=0, value='')
        self.inidsucursal.SetEditable(False)

        self.innombresucursal = wx.TextCtrl(id=wxID_TRANSACCIONINNOMBRESUCURSAL,
              name='innombresucursal', parent=self, pos=wx.Point(80, 8),
              size=wx.Size(184, 21), style=0, value='')
        self.innombresucursal.SetEditable(False)

        self.iniddesSuc = wx.TextCtrl(id=wxID_TRANSACCIONINIDDESSUC,
              name='iniddesSuc', parent=self, pos=wx.Point(56, 32),
              size=wx.Size(24, 21), style=0, value='')
        self.iniddesSuc.SetEditable(False)

        self.indesnombresuc = wx.TextCtrl(id=wxID_TRANSACCIONINDESNOMBRESUC,
              name='indesnombresuc', parent=self, pos=wx.Point(80, 32),
              size=wx.Size(184, 21), style=0, value='')
        self.indesnombresuc.SetEditable(False)

    def __init__(self, parent):
        self._init_ctrls(parent)
        #arma la grilla
        self.padre = parent
        self.sucursal = self.padre.sucursalNro
                
        
        self.cantidad_transferencias = self._cantidad_transferencias()
        if self.cantidad_transferencias == 0:
            utiles.mensaje(self, "No hay ninguna transferencia")
            self.Close()
        
        self.idtransferencia = None
        self.orden_transferencia = 0
        
        self.actualizaSucursales()
        self.grillafactura()
        self._cargar_transferencia(self.orden_transferencia)         

    def actualizaSucursales(self):
        self.sucursalNro, self.nombreSuc = self.padre._sucursal_activa()
        if self.sucursalNro==1:
            self.iniddesSuc.ChangeValue("2")
        else:
            self.iniddesSuc.ChangeValue("1")
        
        
        SQL = "Select nombre from sucursales where idsucursal="+str(self.iniddesSuc.Value)
        dato = consultasBD.ordenCrudaResultDict(SQL)
        
        self.indesnombresuc.ChangeValue(str(dato["nombre"]))
        
        
        self.innombresucursal.ChangeValue(str(self.nombreSuc))
        self.inidsucursal.ChangeValue(str(self.sucursalNro))
    
        
    def _sql_cantidad(self):
        return "SELECT count(*) as cantidad FROM transferencias "

    def _cantidad_transferencias(self):
        sql = self._sql_cantidad()
        resultados = consultasBD.ordenCrudaDict(sql)
        return resultados[0]['cantidad']
        
    def _limpiar_grilla(self):
        for col in range(7):
            for fil in range(60):
                self.grid1.SetCellValue(fil, col, "")

    def _sql_items(self):
        return "SELECT * FROM transferenciastieneproductos t JOIN producto_talle_color ptc ON (t.ptc = ptc.id) JOIN productos p ON (ptc.codsussan = p.codsussan) WHERE t.idtransferencia = '%s'" % self.idtransferencia        

    def _sql_cargar(self):
               return "SELECT *, s1.nombre as origen_nombre, s2.nombre as destino_nombre FROM transferencias t JOIN sucursales s1 ON (t.idsucorigen = s1.idsucursal) JOIN sucursales s2 ON (t.idsucdestino = s2.idsucursal) ORDER BY fecha DESC, id DESC " 

    def _es_antigua(self, id_transferencia):
        sql = "SELECT DATEDIFF( SYSDATE( ) , fecha ) as dias FROM transferencias WHERE id = '%s'" % id_transferencia
        resultado = consultasBD.ordenCrudaResultDict(sql)
        if int(resultado['dias']) > 1:
            return True
        return False
    
    def _borrar_pedidos(self, ptc):
        pass    
    
    def _habilitar(self):
        for x in self.GetChildren():
            x.Enable()
                    
    def _deshabilitar(self):
        for x in self.GetChildren():
            x.Disable()
            
        self.nrotransferencia.Enable()        
        self.spinButton1.Enable()        

    def _cargar_transferencia(self, orden_transferencia):
        sql_ultima = self._sql_cargar()
        resultados = consultasBD.ordenCrudaDict(sql_ultima)
        transferencia = resultados[int(orden_transferencia)]
        
        utiles.cargar_fecha(transferencia['fecha'], self.fechatransferencia)
        
        self.idtransferencia = transferencia['id']                
        self.nrotransferencia.ChangeValue(str(self.idtransferencia))        
        
        self._limpiar_grilla()
        
        sql_items = self._sql_items()
        items = consultasBD.ordenCrudaDict(sql_items)
        
        cantidad = 0
        for i, item in enumerate(items):            
            stock = self._stock(item['ptc'])
            self._mostrar_ptc_en_grilla(i, item, stock)
            self.grid1.SetCellValue(i, 4, str(item['cant']))
            cantidad += item['cant']
            
        self.incantProductos.ChangeValue(str(cantidad))
        
        self.inidsucursal.ChangeValue(transferencia['idsucorigen'])
        self.iniddesSuc.ChangeValue(transferencia['idsucdestino'])
        
        print transferencia
        
        self.innombresucursal.ChangeValue(transferencia['origen_nombre'])
        self.indesnombresuc.ChangeValue(transferencia['destino_nombre'])        
        
##        self._habilitar()
##        if self._es_antigua(self.idtransferencia):
##            self._deshabilitar()                  

    def _cambio_cantidad(self, fila, columna):
        '''Manejador de los cambios en la cantidad'''
        ptc = self.grid1.GetCellValue(fila,0)
        if ptc == "": 
            return
        
        sql = "SELECT * FROM transferenciastieneproductos WHERE idtransferencia = '%s' AND ptc = '%s'" % (self.idtransferencia, ptc)
        item = consultasBD.ordenCrudaResultDict(sql)
        print "CANT", item["cant"]

        stock = self.grid1.GetCellValue(fila,6)
        if int(self.grid1.GetCellValue(fila,4)) > int(stock) + int(item["cant"]):
            utiles.mensaje(self, "La cantidad no puede ser mayor al stock del producto")
            self.grid1.SetCellValue(fila, 4, "1")
            return
        
        # esto cambiando la cantidad y hay un codigo cargado
        self.recuenta() #cuenta los totales
        self.grid1.ForceRefresh()

    def OnGrid1CAMBIACELDa(self, event):
        #detecta un cambio en la grilla
        #la tabla producto:

        columna = self.grid1.GetGridCursorCol()
        fila    = self.grid1.GetGridCursorRow()
        
        if columna == 4:
            self._cambio_cantidad(fila, columna)
            return
            
        if columna == 0:
            self._cambio_codigo(fila, columna)
            return
        
                
    def _restablecer_stock(self, idtransferencia):
        '''Suma el stock que quitan los items de la transferencia'''
        sql_items = "SELECT ti.ptc, cant FROM transferenciastieneproductos ti WHERE ti.idtransferencia = '%s'" % (idtransferencia)
        resultados = consultasBD.ordenCrudaDict(sql_items)
        sucursal = self.sucursal
        for item in resultados:
            
            stock = utiles.stock_sumado(item['ptc'], self.sucursal, item['cant'])
            sql_change = "UPDATE stock SET stock = '%s' WHERE ptc = '%s' AND sucursal = '%s'" % (stock, item['ptc'], self.sucursal)                
            sincronizar_tabla.addChange(sql=sql_change)
            consultasBD.executaSinCommit(None, sql_change)                   

    def _borrar_items(self, idtransferencia):
        sql_borrar = "DELETE FROM transferenciastieneproductos WHERE idtransferencia = '%s'" % idtransferencia
        sincronizar_tabla.addChange(sql=sql_borrar)
        consultasBD.executaSinCommit(None, sql_borrar) 
        
    def _modificar_transferencia(self, idtransferencia):
        pass
                
    def OnImprimir(self, event):
        print "Imprimiendo transferencia"
        fechaTransf = str(self.fechatransferencia.GetValue())[:8]
        fechaTransf = fechaTransf[3:6] + fechaTransf[0:3] + fechaTransf[-2:]
        nroTransf = self.nrotransferencia.GetValue()
        sucOrigen = self.innombresucursal.GetValue()
        sucDestino = self.indesnombresuc.GetValue()
        cantidad = self.incantProductos.GetValue()
        nombre_vista = "Listado de transferencias entre sucursales"
        transferencia = [fechaTransf, nroTransf, sucOrigen, sucDestino, cantidad]
        columnas = ['P.T.C.','Codigo Sussan','Descripcion','Talle','Color','Precio','Cantidad']
        alineacion= [1,1,0,0,0,2,2]

        totalFil = self.grid1.GetNumberRows()
        
        matriz = []
        for i in xrange(totalFil):
            linea = []
            if self.grid1.GetCellValue(i,0) == '':
                continue
            linea.append(self.grid1.GetCellValue(i, 0)) #ptc
            SQL = "SELECT codsussan FROM producto_talle_color WHERE id='%s'" % (self.grid1.GetCellValue(i, 0))
            resultado = consultasBD.ordenCrudaDict(SQL)
            if len(resultado) != 0:
                codsussan = resultado[0]['codsussan']
            else:
                codsussan = ""
            linea.append(codsussan) #cod sussan
            linea.append(self.grid1.GetCellValue(i, 1)) #descripcion
            linea.append(self.grid1.GetCellValue(i, 2)) #talle
            color = self.grid1.GetCellValue(i, 3) #color
            SQL = "SELECT nombre FROM colores WHERE idcolor='%s'" % (color)
            resultado = consultasBD.ordenCrudaDict(SQL)
            if len(resultado) != 0:
                color += " / " + resultado[0]['nombre']
            linea.append(color) 
            linea.append(self.grid1.GetCellValue(i, 5)) #precio
            linea.append(self.grid1.GetCellValue(i, 4)) #cantidad
            matriz.append(linea)
                
        dlg = Vista.Vista(self, nombre_vista)
        dlg.reporte_html(matriz,columnas,alineacion,transferencia)

    def OnBuscartransaccionButton(self, event):
        if self.empezoacargar == 1:
            ventana = DeseaSalir.Dialog1(self)
            try:
                ventana.ShowModal()
                if self.sale == 1: #me dijeron que querian salir
                    self.Close()
            finally:
                ventana.Destroy()
                
            return
            
            

    def OnSalirButton(self, event):
        event.Skip()

    def _sql_orden(self, idtransferencia):
        return "SELECT * FROM (SELECT *, @row := @row + 1 AS fila FROM transferencias t WHERE idsucorigen = '%s' ORDER BY fecha DESC, id DESC) as m WHERE m.id = '%s'" % (self.sucursal, idtransferencia)
    
    def _orden_transferencia(self, idtransferencia):
        consultasBD.executa(None, "SET @row = -1")
        sql = self._sql_orden(idtransferencia)
                
        resultados = consultasBD.ordenCrudaDict(sql, "SET @row = -1")
                
        if len(resultados) == 0:
            print "TRANSFERENCIA NO ENCONTRADA"
            mensaje = wx.MessageDialog(self, "Transferencia No Encontrada", "Error", style=wx.OK,pos = wx.DefaultPosition)
            mensaje.ShowModal()            
            return 0
        else:
            return resultados[0]['fila']        
        
    def OnSpinUp(self, event):
        self.orden_transferencia -= 1
        if self.orden_transferencia < 0:
            self.orden_transferencia = self.cantidad_transferencias - 1
        self._cargar_transferencia(self.orden_transferencia)
        event.Skip()

    def OnSpinDown(self, event):
        self.orden_transferencia = (self.orden_transferencia + 1) % self.cantidad_transferencias
        self._cargar_transferencia(self.orden_transferencia)
        event.Skip()        
        
    def OnNro_transferenciaKillFocus(self, event):
        self.orden_transferencia = self._orden_transferencia(self.nrotransferencia.Value)
        
        self._cargar_transferencia(self.orden_transferencia)
        event.Skip()          
